package class2;

import java.util.Arrays;

/**
 * 非固定概率返回值
 */
public class Code03_NumberRand {
    public static void main(String[] args) {
        int[] counts = new int[8];
        for (int i = 0; i < 1000000; i++) {
            counts[f2()]++;
        }
        System.out.println(Arrays.toString(counts));
    }

    // 返回0 ~ 6
    public static int f2() {
        int v;
        do {
            v = number();
        } while (v == 0); //只需要1-7，因此返回0时，重新生成
        return v;
    }

    // 返回数字000~111 0-7之间的随机数
    public static int number() {
        return (f1() << 2) + (f1() << 1) + (f1() << 0);
    }

    // 等概率返回0和1

    /**
     * 假设 f() 返回 0 的概率是 0.84，返回 1 的概率是 0.16：
     *
     * 如果第一次 f() 返回 0，则第二次必须返回 1（循环会结束），返回的结果是 0。
     * 如果第一次 f() 返回 1，则第二次必须返回 0（循环会结束），返回的结果是 1。
     * 所以最终无论 f() 初始返回的是 0 还是 1，最终的结果都会是 0 或 1，且每种结果的概率为 50%。
     */
    public static int f1() {
        int ans;
        do {
            ans = f();
        } while (ans == f()); // 虽然不是等概率，但如果两次随机是等概率的
        // ans = 0 1
        // ans = 1 0
        return ans;
    }

    /**
     * 默认函数返回1-5随机数
     */
    public static int f() {
        return (Math.random() < 0.84) ? 0 : 1;
    }
}
